﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LibreriaArticulos;

namespace LibreriaGestion
{
	public class GestorAlmacen : IGestorAlmacen
	{
		private IGestorPedidos gestorPedidos { get; set; }

		private IGestorStocks GestorStocks { get; set; }

		List<IArticulo> articulosGestionados;

		public GestorAlmacen(IGestorPedidos gestorPedidos, IGestorStocks gestorStocks)
		{
			this.gestorPedidos = gestorPedidos;
			this.GestorStocks = gestorStocks;
			articulosGestionados = new List<IArticulo>();
		}

		#region Miembros de IGestorAlmacen

		public int getUnidadesDisponibles(LibreriaArticulos.IArticulo articulo)
		{
			return GestorStocks.getStock(articulo) -
				   gestorPedidos.getUnidadesPedidas(articulo);
		}

		public List<IArticulo> getArticulosGestionados()
		{
			return articulosGestionados;
		}

		public void getAlmacenInicial()
		{
			Random r = new Random(DateTime.Now.Millisecond);
			foreach (var a in AlmacenInicial.getArticulos())
			{
				this.addArticulo(a);
				this.incrementaStock(a, r.Next(0, 10));
				this.incrementaUnidadesPedidas(a, r.Next(0, 10));
			}
		}

		#endregion

		#region Miembros de IGestorPedidos

		public void cancelaUnidadesPedidas(IArticulo articulo, int cantidad)
		{
			gestorPedidos.cancelaUnidadesPedidas(articulo, cantidad);
		}

		public void entregaUnidadesPedidas(IArticulo articulo, int cantidad)
		{
			gestorPedidos.entregaUnidadesPedidas(articulo, cantidad);
		}

		public void incrementaUnidadesPedidas(IArticulo articulo, int cantidad)
		{
			gestorPedidos.incrementaUnidadesPedidas(articulo, cantidad);
		}

		public int getUnidadesPedidas(IArticulo articulo)
		{
			return gestorPedidos.getUnidadesPedidas(articulo);
		}

		#endregion

		#region Miembros de IGestorArticulo

		public void eliminaArticulo(IArticulo articulo)
		{
			gestorPedidos.eliminaArticulo(articulo);
			GestorStocks.eliminaArticulo(articulo);
			if (articulosGestionados.Contains(articulo))
				articulosGestionados.Remove(articulo);
		}

		public void addArticulo(IArticulo articulo)
		{
			gestorPedidos.addArticulo(articulo);
			GestorStocks.addArticulo(articulo);

			if (!articulosGestionados.Contains(articulo))
				articulosGestionados.Add(articulo);
		}

		public bool existeArticulo(IArticulo articulo)
		{
			return articulosGestionados.Contains(articulo);
		}
		#endregion

		#region Miembros de IGestorStocks

		public void incrementaStock(IArticulo articulo, int cantidad)
		{
			GestorStocks.incrementaStock(articulo, cantidad);
		}

		public void reduceStock(IArticulo articulo, int cantidad)
		{
			GestorStocks.reduceStock(articulo, cantidad);
		}

		public int getStock(IArticulo articulo)
		{
			return GestorStocks.getStock(articulo);
		}

		#endregion
	}
}